package com.ronan.common.utils;

import com.ronan.common.pojo.RimUmsInfo;
import io.netty.channel.Channel;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * FileName    : com.ronan.imserver.utils
 * Description : 维护 用户 <=> Channel 的关系
 *
 * @author : ronan
 * @version : 1.0
 * Create Date : 2021/2/26 11:28
 **/
public class SessionManager {


    /** 保存用户与通道的关系 */
    private static final Map<String, Channel> CHANNEL_MAP = new ConcurrentHashMap<>();

    /** 会话 保存用户信息 */
    private static final Map<String, String> SESSION_MAP = new ConcurrentHashMap<>();

    /**
     * 保存
     *
     * @param accid 用户id
     * @param token   的名字
     */
    public static void saveSession(String accid, String token) {
        SESSION_MAP.put(accid, token);
    }

    /**
     * 删除
     *
     * @param userId 用户id
     */
    public static void removeSession(String userId) {
        SESSION_MAP.remove(userId);
    }

    /**
     * 获得
     *
     * @param accid 用户id
     * @return {@link String}
     */
    public static String getSession(String accid) {
        return SESSION_MAP.get(accid);
    }


    /**
     * 得到渠道
     *
     * @return {@link Map<String, Channel>}
     */
    public static Map<String, Channel> getChannels() {
        return CHANNEL_MAP;
    }


    /**
     * 保存关系
     *
     * @param accid  用户id
     * @param channel 通道
     */
    public static void put(String accid, Channel channel) {
        CHANNEL_MAP.put(accid, channel);
    }

    /**
     * 根据userId得到channel
     *
     * @param accid 用户id
     * @return {@link Channel}
     */
    public static Channel get(String accid) {
        return CHANNEL_MAP.get(accid);
    }

    /**
     * 删除关系
     *
     * @param channel 通道
     */
    public static void remove(Channel channel) {
        CHANNEL_MAP.entrySet().stream().filter(e -> e.getValue() == channel).forEach(c -> CHANNEL_MAP.remove(c.getKey()));
    }


    /**
     * 得到注册用户信息
     *
     * @param channel 通道
     * @return {@link RimUmsInfo}
     */
    public static RimUmsInfo getUmsInfo(Channel channel) {
        for (Map.Entry<String, Channel> entry : CHANNEL_MAP.entrySet()) {
            if (entry.getValue() == channel) {
                return new RimUmsInfo(entry.getKey(), SESSION_MAP.get(entry.getKey()));
            }
        }
        return null;
    }

}
